package com.algorithm.queue;/*
 *@Author:DOWN
 *@Date:2021/12/28 9:37
 *@Comment:
 */

public class MyCircularQueue {
    private int[] data;
    private int front,tail,size;

    /**
     *  构造器，设置队列长度为 k
     * @param k int
     */
    public MyCircularQueue(int k) {
        this.data=new int[k];
        this.front=0;
        this.tail=0;
        this.size=0;
    }

    /**
     *  向循环队列插入一个元素。如果成功插入则返回真。
     * @param value 元素
     * @return boolean
     */
    public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        this.data[tail]=value;
        this.tail=(tail+1)%this.data.length;
        size++;
        return true;
    }

    /**
     *  从循环队列中删除一个元素。如果成功删除则返回真。
     * @return boolean
     */
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        this.front=(this.front+1)%this.data.length;
        size--;
        return true;
    }

    /**
     * 从队首获取元素。如果队列为空，返回 -1
     * @return int
     */
    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return this.data[this.front];
    }

    /**
     * 获取队尾元素。如果队列为空，返回 -1 。
     * @return int
     */
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        return this.tail==0?this.data[this.data.length-1]:this.data[this.tail-1];
    }

    public boolean isEmpty() {
        return this.size==0;
    }

    public boolean isFull() {
        return this.size==this.data.length;
    }
}
